import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 Java 8 方法引用
     网站：https://www.runoob.com/java/java8-method-references.html
 */
public class JDK_2 {
    public static void main(String[] args) {
        /**
         * 方法引用实例
         */
        List<String> names = new ArrayList();
        names.add("Google");
        names.add("Runoob");
        names.add("Taobao");
        names.add("Baidu");
        names.add("Sina");
        names.forEach(System.out::println);
    }
}

@FunctionalInterface
interface Supplier<T> {
    T get();
}

class Car{
    // Supplier是jdk1.8的接口，这里和lamda一起使用了
    public static Car create(final Supplier<Car> supplier){
        return supplier.get();
    }

    public static void collide(final Car car) {
        System.out.println("Collided " + car.toString());
    }

    public void follow(final Car another) {
        System.out.println("Following the " + another.toString());
    }

    public void repair() {
        System.out.println("Repaired " + this.toString());
    }
}

class Test{
    public static void main(String[] args) {
        /**
         * 构造器引用：它的语法是Class::new，或者更一般的Class< T >::new
         *  实例如下：
         */
        final Car car = Car.create( Car::new );
        final List< Car > cars = Arrays.asList( car );
        /**
         * 静态方法引用：它的语法是Class::static_method
         *  实例如下：
         */
        cars.forEach( Car::collide );
        /**
         * 特定类的任意对象的方法引用：它的语法是Class::method
         *  实例如下：
         */
        cars.forEach( Car::repair );
        /**
         * 特定类的任意对象的方法引用：它的语法是Class::method
         *  实例如下：
         */
        final Car police = Car.create( Car::new );
        cars.forEach( police::follow);
    }
}